/******************************************************************************
 * @file     iic.h
 * @brief    Bootloader中软件iic相关函数
 * @author   Ruilist
 * @date     2025-08-21
 * @version  V1.0.0
 * @copyright Copyright (c) 2025
 *
 * @note     1 tab = 4 space
 *
 * @par 日志:
 * - V1.0.0 2025-08-21 Ruilist
 *****************************************************************************/

#ifndef _IIC_H
#define _IIC_H

//******************************** Includes *********************************//

#include "main.h"
#include "stm32f4xx.h"
#include "AT24Cxx_Driver.h"

//******************************** Includes *********************************//

//******************************** Defines **********************************//

#define EEPROM_I2C_WR         0  // EEPROM 写
#define EEPROM_I2C_RD         1  // EEPROM 读

#define EEPROM_I2C_GPIO_PORT  GPIOB
#define EEPROM_I2C_GPIO_CLK   RCC_AHB1Periph_GPIOB
#define EEPROM_I2C_SCL_PIN    GPIO_Pin_8
#define EEPROM_I2C_SDA_PIN    GPIO_Pin_9

#define EEPROM_I2C_SCL_1()    GPIO_SetBits( EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN );
#define EEPROM_I2C_SCL_0()    GPIO_ResetBits( EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN );

#define EEPROM_I2C_SDA_1()    GPIO_SetBits( EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN );
#define EEPROM_I2C_SDA_0()    GPIO_ResetBits( EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN );

// 读取SDA引脚的电平状态
#define EEPROM_I2C_SDA_READ() GPIO_ReadInputDataBit( EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SDA_PIN )

//******************************** Defines **********************************//

/**
 * @brief   软iic的io接口初始化，SDA PB9，SCL PB8
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_gpio_init( void );

/**
 * @brief   软iic的delay函数
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_Delay( void );

/**
 * @brief   软iic的start函数
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_Start( void );

/**
 * @brief   软iic的stop函数
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_Stop( void );

/**
 * @brief   软iic的ack函数
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_Ack( void );

/**
 * @brief   软iic的nack函数
 *
 * @param   void
 *
 * @return  void
 *
 */
void i2c_NAck( void );


/**
 * @brief   等待iic设备应答
 *
 * @param   void
 *
 * @return  uint8_t
 * @retval  0 正确应答
 * @retval  1 无器件响应
 *
 */
uint8_t i2c_WaitAck( void );

/**
 * @brief   软iic发送一个字节
 *
 * @param   uint8_t Byte 要发送的字节
 *
 * @return  void
 *
 */
void i2c_SendByte( uint8_t Byte );

/**
 * @brief   软iic接收一个字节
 *
 * @param   void
 *
 * @return  uint8_t
 * @retval  byte 接收到的字节
 *
 */
uint8_t i2c_ReadByte( void );

/**
 * @brief   软iic接收一个字节
 *
 * @param   uint8_t Address
 *
 * @return  uint8_t
 * @retval  0 正确应答
 * @retval  1 无器件响应
 *
 */
uint8_t i2c_CheckDevice( uint8_t Address );

#endif  // End of _IIC_H